/*
*
==============================================================================
*  Name        : 
*  Part of     : Omen Game Engine
*  Description : 
*  Version     : 1.0
*
*  Copyright (c) 2013 Lauri Kortevaara.
* 
==============================================================================
*/

#pragma once

#include "OmenConfig.h"
#include "IOmenPhysicsComponent.h"

namespace Omen
{
    class IRigidBody : public Omen::IPhysicsComponent
    {
        /// Default rigid body properties
        #define DEFAULT_DRAG            0.00f
        #define DEFAULT_ANGULAR_DRAG    0.05f
        #define DEFAULT_MASS            1.00f

    public:
        virtual Omen_GUID classId() const = 0;                          /// <summary>Defines the class ID</summary>

        virtual Omen::Float mass() const = 0;                           /// <summary>Returns the mass of the physical object</summary>
        virtual void setMass( const Omen::Float& mass ) = 0;            /// <summary>Sets the mass of the physical object</summary>

        virtual Omen::Float drag() const = 0;                           /// <summary>Returns the value of how much air resistance slows down the moving of the physical object. 0 means no air resistance, infinity means that movement stops immeadiately.</summary>
        virtual void setDrag( const Omen::Float& drag ) = 0;                /// <summary>Sets the value of how much air resistance slows down the moving of the object</summary>

        virtual Omen::Float angularDrag() const = 0;                    /// <summary>Returns the value of how much air resistance slows down the rotation of the physical object. 0 means no air resistance, infinity means that rotation stops immeadiately.</summary>
        virtual void setAngularDrag( const Omen::Float& aDrag ) = 0;    /// <summary>Sets the value of how much air resistance slows down the rotation of the object</summary>

        virtual bool useGravity() const = 0;                            /// <summary>Returns true if this object uses gravity</summary>
        virtual void setUseGravity( bool bUseGravity ) = 0;             /// <summary>Sets bool value of whether this object is affected by gravity</summary>
        
        virtual Omen::Vector3d moveConstraints() const = 0;             /// <summary>Returns a 3d-vector which defines the movement constraints of this physical object. Vector3d(1,1,1) stops the moving the object in x,y,z directions, Vector3d(0,0,0) Allows movement in all x,y,z directions</summary>
        virtual void setMoveConstraints( const Omen::Vector3d& constraints ) = 0; /// <summary>Sets a 3d vector defining the movement constraints</summary>

        virtual Omen::Vector3d rotationConstraints() const = 0;         /// <summary>Returns a 3d-vector, with possible values: Vector3d(1,1,1) stops the rotating the object in x,y,z directions, Vector3d(0,0,0) Allows rotation in all x,y,z directions</summary>
        virtual void setRotationConstraints( const Omen::Vector3d& constraints ) = 0; /// <summary>Sets a 3d vector defining the rotation constraints</summary>
    protected:
    private:
    };
}